package abstractFactoryPattern;

/**
 * 抽象工厂模式
 * The essence of the Abstract Factory Pattern
 * is to "Provide an interface for creating families of related or dependent objects
 * without specifying their concrete classes
 * 抽象工厂为创建一组相关或者是相互依赖的对象提供一个接口，而不需要指定他们的具体类
 *
 * 强调"产品家族"这个概念，当有一组不同对象并且相关，只需要一个接口新建出来，不用一个个new出来
 *
 */
public class AbstractFactoryPatternMain {

    /**
     *  具体场景：
     *  一个工厂 为 小米公司 和 苹果公司 加工手机和电脑
     *  小米系列 手机系统为安卓 电脑系统为windos
     *  苹果系列 手机系统为苹果 电脑系统为mac
     *
     *  实际分析：
     *  工厂是干嘛的？ 制造手机和电脑  可以抽象出一个 工厂的抽象类，功能也就是方法，做手机，做电脑
     *  然后向下分析，可以又做苹果系列又做小米系列么？ 不可以因为那不是一个系统，所一得分出两条产品线 小米阵营 苹果阵营
     *  然后向下分析， 小米（苹果）阵营是干嘛的？ 生产自己阵营的手机和电脑，所以出两个方法 做自己阵容手机，电脑
     *
     *  这个"阵营"，实际就是上面的"产品家族"这个概念
     *
     *  Ps：每个类上有创建步骤排序，方便理解
     *
     */

    // 现在开始试一下
    public static void main(String[] args) {
                                            // 解析一下：
        // AbstractFactory mi = new MI();      // 通过工厂创建 MI 对象（创建产品线）
        // mi.makeComputer().setSystem();      // mi.makeComputer() 创建 MiPhone对象 ；MiPhone对象调用setSystem()
        // mi.makePhone().setSystem();         // 同上
        //
        // AbstractFactory ap = new Apple();
        // ap.makePhone().setSystem();
        // ap.makeComputer().setSystem();

        // 记一个坑
        String a = " a a　";
        String b = a.replaceAll("(^ )|(　$) ", "\u00A0");
        System.out.println(b);
    }
}
